home *** CD-ROM | disk | FTP | other *** search
- .MODEL SMALL
- .CODE
-
-
- PUBLIC _FixedMul
- FMparms STRUC
- DW 2 DUP(?)
- M1low DW ?
- M1hi DW ?
- M2low DW ?
- M2hi DW ?
- FMparms ENDS
- ALIGN 2
- _FixedMul PROC
- push bp
- mov bp,sp
- sub sp,2 ; word ptr [bp-2] = SignFlag
- mov WORD PTR [bp-2],0
- mov ax,[bp].M1low
- mov bx,[bp].M1hi
- or bx,bx
- jns FMpositivo1
- not bx
- not ax
- inc ax
- adc bx,0
- mov [bp].M1low,ax
- mov [bp].M1hi,bx
- xor WORD PTR [bp-2],1
- FMpositivo1:
- mov ax,[bp].M2low
- mov bx,[bp].M2hi
- or bx,bx
- jns FMpositivo2
- not bx
- not ax
- inc ax
- adc bx,0
- mov [bp].M2low,ax
- mov [bp].M2hi,bx
- xor WORD PTR [bp-2],1
- FMpositivo2:
- mov ax,[bp].M1low
- mov bx,[bp].M2hi
- mul bx
- mov cx,ax
- mov si,dx
- mov ax,[bp].M1hi
- mov bx,[bp].M2low
- mul bx
- add cx,ax
- adc si,dx
- mov ax,[bp].M1hi
- mov bx,[bp].M2hi
- mul bx
- add si,ax
- mov ax,[bp].M1low
- mov bx,[bp].M2low
- mul bx
- shl ax,1
- adc cx,dx
- adc si,0
- mov dx,si
- mov ax,cx
- mov cx,[bp-2]
- or cx,cx
- jz FMpositivoRes
- not ax
- not dx
- inc ax
- adc dx,0
- FMpositivoRes:
- mov sp,bp
- pop bp
- ret
- _FixedMul ENDP
-
-
- PUBLIC _FixedDiv
- FDparms STRUC
- dw 2 dup(?)
- Dlow dw ?
- Dhi dw ?
- dlow dw ?
- dhi dw ?
- FDparms ENDS
- ALIGN 2
- _FixedDiv PROC
- push bp
- mov bp,sp
- sub sp,2 ;[bp-2]=sign
- push si
- push di
- mov WORD PTR [bp-2],0
- mov ax,[bp].Dlow
- mov bx,[bp].Dhi
- or bx,bx
- jns FDpositivo1
- not bx
- not ax
- inc ax
- adc bx,0
- mov [bp].Dlow,ax
- mov [bp].Dhi,bx
- xor WORD PTR [bp-2],1
- FDpositivo1:
- mov ax,[bp].dlow
- mov bx,[bp].dhi
- or bx,bx
- jns FDpositivo2
- not bx
- not ax
- inc ax
- adc bx,0
- mov [bp].dlow,ax
- mov [bp].dhi,bx
- xor WORD PTR [bp-2],1
- FDpositivo2:
- mov ax,[bp].Dhi
- or ax,ax
- jnz Not1632
- mov ax,[bp].dhi
- push ax
- mov ax,[bp].dlow
- push ax
- mov ax,[bp].Dlow
- push ax
- xor ax,ax
- push ax
- call LongPosDiv
- add sp,8
- jmp DivDone
- Not1632:
- mov ax,[bp].dlow
- or ax,ax
- jnz Not3216
- mov cx,[bp].dhi
- mov ax,[bp].Dhi
- xor dx,dx
- div cx
- mov bx,ax
- mov ax,[bp].Dlow
- div cx
- mov dx,bx
- jmp DivDone
- Not3216:
- mov ax,[bp].dhi
- or ax,ax
- jnz Not4816
- mov dx,[bp].Dhi
- mov ax,[bp].Dlow
- mov bx,[bp].dlow
- div bx
- mov cx,ax ;HiResultado
- xor ax,ax
- div bx
- mov dx,cx ;HiResultado
- jmp DivDone
- Not4816:
- mov dx,[bp].Dhi
- mov ax,[bp].Dlow
- xor di,di
- mov bx,[bp].dhi
- mov cx,[bp].dlow
- ShiftAgain:
- shr bx,1 ;32hi16
- rcr cx,1 ;32lo16
- shr dx,1 ;48hi16
- rcr ax,1 ;48mid16
- rcr di,1 ;48lo16
- or bx,bx
- jnz ShiftAgain
- div cx
- mov si,ax ;HiRes
- mov ax,di ;48lo16
- div cx
- ;ahora tenemos: si·ax=aprox. del resultado
- push si
- push ax
- xor di,di
- push ax
- mul WORD PTR [bp].dlow
- mov cx,dx
- mov di,ax
- pop ax
- mul WORD PTR [bp].dhi
- add cx,ax
- add bx,dx
- mov ax,si
- mul WORD PTR [bp].dlow
- add cx,ax
- add bx,dx
- mov ax,si
- mul WORD PTR [bp].dhi
- add bx,ax
- pop ax
- pop si
- cmp bx,[bp].Dhi
- ja DecreaseAprox
- jb DontDecreaseAprox
- cmp cx,[bp].Dlow
- ja DecreaseAprox
- jb DontDecreaseAprox
- or di,di
- jz DontDecreaseAprox
- DecreaseAprox:
- sub ax,1
- sbb si,0
- DontDecreaseAprox:
- mov dx,si
- DivDone:
- mov cx,[bp-2]
- or cx,cx
- jz FDpositivoRes
- not ax
- not dx
- inc ax
- adc dx,0
- FDpositivoRes:
- pop di
- pop si
- mov sp,bp
- pop bp
- ret
- _FixedDiv ENDP
-
- LongPosDiv PROC
- push bp
- mov bp,sp
- push si
- push bx
- mov ax,[bp+10]
- or ax,ax
- jnz LPDiv3232
- mov cx,[bp+8]
- mov ax,[bp+6]
- xor dx,dx
- div cx
- mov bx,ax
- mov ax,[bp+4]
- div cx
- mov dx,bx
- jmp LPDivDone
- LPDiv3232:
- mov bx,ax
- mov cx,[bp+8]
- mov dx,[bp+6]
- mov ax,[bp+4]
- LPShiftAgain:
- shr bx,1
- rcr cx,1
- shr dx,1
- rcr ax,1
- or bx,bx
- jnz LPShiftAgain
- div cx
- mov si,ax
- mul WORD PTR [bp+10]
- xchg ax,cx
- mov ax,[bp+8]
- mul si
- add dx,cx
- jc LPDecreaseAprox
- cmp dx,[bp+6]
- ja LPDecreaseAprox
- jb LPDontDecreaseAprox
- cmp ax,[bp+4]
- jbe LPDontDecreaseAprox
- LPDecreaseAprox:
- dec si
- LPDontDecreaseAprox:
- xor dx,dx
- xchg ax,si
- LPDivDone:
- pop bx
- pop si
- mov sp,bp
- pop bp
- ret
- LongPosDiv ENDP
-
-
- PUBLIC _FixedTrunc
- FTparms STRUC
- DW 2 dup(?)
- FTarglow DW ?
- FTarghi DW ?
- FTparms ENDS
- ALIGN 2
- _FixedTrunc PROC
- push bp
- mov bp,sp
- mov dx,[bp].FTarghi
- xor ax,ax
- pop bp
- ret
- _FixedTrunc ENDP
-
- PUBLIC _FixedFractional
- FFparms STRUC
- DW 2 dup(?)
- FFarglow DW ?
- FFarghi DW ?
- FFparms ENDS
- ALIGN 2
- _FixedFractional PROC
- push bp
- mov bp,sp
- mov ax,[bp].FTarglow
- xor dx,dx
- pop bp
- ret
- _FixedFractional ENDP
-
- END